using Godot;
using System;
using Godot.Collections;
using Smr.基类;
using Smr.枚举;
using Smr;


public partial class 组件角色 : Node2D
{
    [Signal] public delegate void 信号动画结束EventHandler();
    [Export] private PackedScene 飘字场景;

    public C角色模型 角色模型 = new();
    public int 角色站位 = -1;

    private 组件进度条 红条;
    private 组件进度条 蓝条;
    private Label 名称;
    private E角色战斗状态 角色状态 = E角色战斗状态.正常;
    private HBoxContainer 状态栏;
    private Marker2D 飘字位置;

    private enum E动画状态
    {
        被攻击,
        攻击
    }

    private Dictionary<E动画状态, bool> 动画状态 = new()
    {
        { E动画状态.被攻击, false },
        { E动画状态.攻击, false }
    };

    public override void _Ready()
    {
        红条 = GetNode<组件进度条>("红条");
        蓝条 = GetNode<组件进度条>("蓝条");
        名称 = GetNode<Label>("名称");
        红条.置数值(角色模型.战斗属性.体力);
        蓝条.置数值(角色模型.战斗属性.精力);
        名称.Text = 角色模型.基础属性.名称;
        状态栏 = GetNode<HBoxContainer>("状态栏");
        飘字位置 = GetNode<Marker2D>("飘字位置");
    }

    public void 被攻击(float 值, bool 是否暴击 = false)
    {
        if (角色状态 == E角色战斗状态.死亡) { return; }
        if (动画状态[E动画状态.被攻击]) return;
        动画状态[E动画状态.被攻击] = true;
        角色模型.战斗属性.体力 -= (int)值;
        被攻击动画(值, 是否暴击);
    }

    private async void 被攻击动画(float 值, bool 是否暴击 = false)
    {
        var 初始位置 = Position;
        Tween 补间动画 = CreateTween().BindNode(this);
        for (int i = 0; i < 3; i++)
        {
            补间动画.TweenProperty(this, "position", new Vector2(初始位置.X - 10, 初始位置.Y), 0.05 * 配置.战斗加速[游戏存档.战斗加速]);
            补间动画.TweenProperty(this, "position", new Vector2(初始位置.X + 10, 初始位置.Y), 0.05 * 配置.战斗加速[游戏存档.战斗加速]);
        }
        await ToSignal(补间动画, Tween.SignalName.Finished);
        Position = 初始位置;

        红条.置当前值((int)角色模型.战斗属性.体力);

        组件战斗飘字 飘字 = 飘字场景.Instantiate<组件战斗飘字>();
        飘字.数值 = (int)值;
        飘字.位置 = 飘字位置.Position;
        飘字.是否暴击 = 是否暴击;
        AddChild(飘字);
        await ToSignal(飘字, 组件战斗飘字.SignalName.信号动画结束);

        动画状态[E动画状态.被攻击] = false;
        动画结束();
    }

    public void 攻击()
    {
        if (动画状态[E动画状态.攻击]) return;
        动画状态[E动画状态.攻击] = true;
        攻击动画();
    }

    private async void 攻击动画()
    {
        Tween 补间动画 = CreateTween().BindNode(this);
        for (int i = 0; i < 3; i++)
        {
            补间动画.TweenProperty(this, "scale", Scale + new Vector2(0.4f, 0.4f), 0.08 * 配置.战斗加速[游戏存档.战斗加速]);
        }
        await ToSignal(补间动画, Tween.SignalName.Finished);
        Scale = new Vector2(1, 1);
        动画状态[E动画状态.攻击] = false;
        动画结束();
    }

    private void 清空角色状态()
    {
        foreach (var 子项 in 状态栏.GetChildren())
        {
            子项.QueueFree();
        }
    }

    private void 添加角色状态(E角色战斗状态 待添加状态)
    {
        switch (待添加状态)
        {
            case E角色战斗状态.死亡:
                Label 死亡状态 = new()
                {
                    Text = "亡",
                    LabelSettings = new()
                    {
                        FontColor = new Color("red"),
                        FontSize = 26
                    }
                };
                状态栏.AddChild(死亡状态);
                break;
            default:
                break;
        }
    }

    private void 动画结束()
    {
        if (角色模型.战斗属性.体力 <= 0)
        {
            角色状态 = E角色战斗状态.死亡;
            清空角色状态();
            // 添加角色状态(角色状态);
            Modulate = new Color(1, 1, 1, 0.5f);
        }
        EmitSignal(SignalName.信号动画结束);
    }
}
